{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "47557fd8",
   "metadata": {},
   "source": [
    "# DAY 27"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e107a734",
   "metadata": {},
   "source": [
    "友情提示：今天的内容难度较大，也是在我之前学习的时候卡住我很久都没理解的地方，所以任务量不多，着重理解我的示例代码即可\n",
    "\n",
    "\n",
    "昨天我们接触到了函数大部分的功能，然后在你日常ctrl点进某个复杂的项目，发现函数上方有一个@xxx,它就是装饰器\n",
    "\n",
    "装饰器本质上是一个 Python 函数，它可以让其他函数或方法在不需要做任何代码修改的前提下增加额外功能。--本质是如果让一个函数具备太多功能，那么他看起来就会比较乱，可读性比较差，如果把其中一部分相同甚至可以复用的功能用一个新的函数来调用，然后让2个函数同时实现，就会做到\n",
    "1. 进一步封装了函数的一些用法，做到dry原则（don't repeat yourself）\n",
    "2. 使函数更加具有可读性\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "066b0fe2",
   "metadata": {},
   "source": [
    "所以装饰器本身就是函数中调用其他函数，实现先拆分函数，再合并函数的功能。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "868fea2d",
   "metadata": {},
   "source": [
    "## 普通的函数\n",
    "\n",
    "下面这个函数实现的是计算2到9999的所有质数（在大于 1 的自然数中，除了 1 和它自身外，不能被其他自然数整除的数），并且打印找到这些数需要的时间\n",
    "1. 定义一个判断是否为质数\n",
    "2. 定义一个函数，循环2到9999的数，通过判断质数函数来筛选每个数\n",
    "3. 在函数中通过time模块进行记时\n",
    "\n",
    "会发现，这个time模块让整个代码逻辑很混乱，因为函数的主体是找质数，time模块是找质数的时间，如果可以time模块放在函数外，这样逻辑才清晰"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "f9cc6322",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "5\n",
      "7\n",
      "11\n",
      "13\n",
      "17\n",
      "19\n",
      "23\n",
      "29\n",
      "31\n",
      "37\n",
      "41\n",
      "43\n",
      "47\n",
      "53\n",
      "59\n",
      "61\n",
      "67\n",
      "71\n",
      "73\n",
      "79\n",
      "83\n",
      "89\n",
      "97\n",
      "101\n",
      "103\n",
      "107\n",
      "109\n",
      "113\n",
      "127\n",
      "131\n",
      "137\n",
      "139\n",
      "149\n",
      "151\n",
      "157\n",
      "163\n",
      "167\n",
      "173\n",
      "179\n",
      "181\n",
      "191\n",
      "193\n",
      "197\n",
      "199\n",
      "211\n",
      "223\n",
      "227\n",
      "229\n",
      "233\n",
      "239\n",
      "241\n",
      "251\n",
      "257\n",
      "263\n",
      "269\n",
      "271\n",
      "277\n",
      "281\n",
      "283\n",
      "293\n",
      "307\n",
      "311\n",
      "313\n",
      "317\n",
      "331\n",
      "337\n",
      "347\n",
      "349\n",
      "353\n",
      "359\n",
      "367\n",
      "373\n",
      "379\n",
      "383\n",
      "389\n",
      "397\n",
      "401\n",
      "409\n",
      "419\n",
      "421\n",
      "431\n",
      "433\n",
      "439\n",
      "443\n",
      "449\n",
      "457\n",
      "461\n",
      "463\n",
      "467\n",
      "479\n",
      "487\n",
      "491\n",
      "499\n",
      "503\n",
      "509\n",
      "521\n",
      "523\n",
      "541\n",
      "547\n",
      "557\n",
      "563\n",
      "569\n",
      "571\n",
      "577\n",
      "587\n",
      "593\n",
      "599\n",
      "601\n",
      "607\n",
      "613\n",
      "617\n",
      "619\n",
      "631\n",
      "641\n",
      "643\n",
      "647\n",
      "653\n",
      "659\n",
      "661\n",
      "673\n",
      "677\n",
      "683\n",
      "691\n",
      "701\n",
      "709\n",
      "719\n",
      "727\n",
      "733\n",
      "739\n",
      "743\n",
      "751\n",
      "757\n",
      "761\n",
      "769\n",
      "773\n",
      "787\n",
      "797\n",
      "809\n",
      "811\n",
      "821\n",
      "823\n",
      "827\n",
      "829\n",
      "839\n",
      "853\n",
      "857\n",
      "859\n",
      "863\n",
      "877\n",
      "881\n",
      "883\n",
      "887\n",
      "907\n",
      "911\n",
      "919\n",
      "929\n",
      "937\n",
      "941\n",
      "947\n",
      "953\n",
      "967\n",
      "971\n",
      "977\n",
      "983\n",
      "991\n",
      "997\n",
      "1009\n",
      "1013\n",
      "1019\n",
      "1021\n",
      "1031\n",
      "1033\n",
      "1039\n",
      "1049\n",
      "1051\n",
      "1061\n",
      "1063\n",
      "1069\n",
      "1087\n",
      "1091\n",
      "1093\n",
      "1097\n",
      "1103\n",
      "1109\n",
      "1117\n",
      "1123\n",
      "1129\n",
      "1151\n",
      "1153\n",
      "1163\n",
      "1171\n",
      "1181\n",
      "1187\n",
      "1193\n",
      "1201\n",
      "1213\n",
      "1217\n",
      "1223\n",
      "1229\n",
      "1231\n",
      "1237\n",
      "1249\n",
      "1259\n",
      "1277\n",
      "1279\n",
      "1283\n",
      "1289\n",
      "1291\n",
      "1297\n",
      "1301\n",
      "1303\n",
      "1307\n",
      "1319\n",
      "1321\n",
      "1327\n",
      "1361\n",
      "1367\n",
      "1373\n",
      "1381\n",
      "1399\n",
      "1409\n",
      "1423\n",
      "1427\n",
      "1429\n",
      "1433\n",
      "1439\n",
      "1447\n",
      "1451\n",
      "1453\n",
      "1459\n",
      "1471\n",
      "1481\n",
      "1483\n",
      "1487\n",
      "1489\n",
      "1493\n",
      "1499\n",
      "1511\n",
      "1523\n",
      "1531\n",
      "1543\n",
      "1549\n",
      "1553\n",
      "1559\n",
      "1567\n",
      "1571\n",
      "1579\n",
      "1583\n",
      "1597\n",
      "1601\n",
      "1607\n",
      "1609\n",
      "1613\n",
      "1619\n",
      "1621\n",
      "1627\n",
      "1637\n",
      "1657\n",
      "1663\n",
      "1667\n",
      "1669\n",
      "1693\n",
      "1697\n",
      "1699\n",
      "1709\n",
      "1721\n",
      "1723\n",
      "1733\n",
      "1741\n",
      "1747\n",
      "1753\n",
      "1759\n",
      "1777\n",
      "1783\n",
      "1787\n",
      "1789\n",
      "1801\n",
      "1811\n",
      "1823\n",
      "1831\n",
      "1847\n",
      "1861\n",
      "1867\n",
      "1871\n",
      "1873\n",
      "1877\n",
      "1879\n",
      "1889\n",
      "1901\n",
      "1907\n",
      "1913\n",
      "1931\n",
      "1933\n",
      "1949\n",
      "1951\n",
      "1973\n",
      "1979\n",
      "1987\n",
      "1993\n",
      "1997\n",
      "1999\n",
      "2003\n",
      "2011\n",
      "2017\n",
      "2027\n",
      "2029\n",
      "2039\n",
      "2053\n",
      "2063\n",
      "2069\n",
      "2081\n",
      "2083\n",
      "2087\n",
      "2089\n",
      "2099\n",
      "2111\n",
      "2113\n",
      "2129\n",
      "2131\n",
      "2137\n",
      "2141\n",
      "2143\n",
      "2153\n",
      "2161\n",
      "2179\n",
      "2203\n",
      "2207\n",
      "2213\n",
      "2221\n",
      "2237\n",
      "2239\n",
      "2243\n",
      "2251\n",
      "2267\n",
      "2269\n",
      "2273\n",
      "2281\n",
      "2287\n",
      "2293\n",
      "2297\n",
      "2309\n",
      "2311\n",
      "2333\n",
      "2339\n",
      "2341\n",
      "2347\n",
      "2351\n",
      "2357\n",
      "2371\n",
      "2377\n",
      "2381\n",
      "2383\n",
      "2389\n",
      "2393\n",
      "2399\n",
      "2411\n",
      "2417\n",
      "2423\n",
      "2437\n",
      "2441\n",
      "2447\n",
      "2459\n",
      "2467\n",
      "2473\n",
      "2477\n",
      "2503\n",
      "2521\n",
      "2531\n",
      "2539\n",
      "2543\n",
      "2549\n",
      "2551\n",
      "2557\n",
      "2579\n",
      "2591\n",
      "2593\n",
      "2609\n",
      "2617\n",
      "2621\n",
      "2633\n",
      "2647\n",
      "2657\n",
      "2659\n",
      "2663\n",
      "2671\n",
      "2677\n",
      "2683\n",
      "2687\n",
      "2689\n",
      "2693\n",
      "2699\n",
      "2707\n",
      "2711\n",
      "2713\n",
      "2719\n",
      "2729\n",
      "2731\n",
      "2741\n",
      "2749\n",
      "2753\n",
      "2767\n",
      "2777\n",
      "2789\n",
      "2791\n",
      "2797\n",
      "2801\n",
      "2803\n",
      "2819\n",
      "2833\n",
      "2837\n",
      "2843\n",
      "2851\n",
      "2857\n",
      "2861\n",
      "2879\n",
      "2887\n",
      "2897\n",
      "2903\n",
      "2909\n",
      "2917\n",
      "2927\n",
      "2939\n",
      "2953\n",
      "2957\n",
      "2963\n",
      "2969\n",
      "2971\n",
      "2999\n",
      "3001\n",
      "3011\n",
      "3019\n",
      "3023\n",
      "3037\n",
      "3041\n",
      "3049\n",
      "3061\n",
      "3067\n",
      "3079\n",
      "3083\n",
      "3089\n",
      "3109\n",
      "3119\n",
      "3121\n",
      "3137\n",
      "3163\n",
      "3167\n",
      "3169\n",
      "3181\n",
      "3187\n",
      "3191\n",
      "3203\n",
      "3209\n",
      "3217\n",
      "3221\n",
      "3229\n",
      "3251\n",
      "3253\n",
      "3257\n",
      "3259\n",
      "3271\n",
      "3299\n",
      "3301\n",
      "3307\n",
      "3313\n",
      "3319\n",
      "3323\n",
      "3329\n",
      "3331\n",
      "3343\n",
      "3347\n",
      "3359\n",
      "3361\n",
      "3371\n",
      "3373\n",
      "3389\n",
      "3391\n",
      "3407\n",
      "3413\n",
      "3433\n",
      "3449\n",
      "3457\n",
      "3461\n",
      "3463\n",
      "3467\n",
      "3469\n",
      "3491\n",
      "3499\n",
      "3511\n",
      "3517\n",
      "3527\n",
      "3529\n",
      "3533\n",
      "3539\n",
      "3541\n",
      "3547\n",
      "3557\n",
      "3559\n",
      "3571\n",
      "3581\n",
      "3583\n",
      "3593\n",
      "3607\n",
      "3613\n",
      "3617\n",
      "3623\n",
      "3631\n",
      "3637\n",
      "3643\n",
      "3659\n",
      "3671\n",
      "3673\n",
      "3677\n",
      "3691\n",
      "3697\n",
      "3701\n",
      "3709\n",
      "3719\n",
      "3727\n",
      "3733\n",
      "3739\n",
      "3761\n",
      "3767\n",
      "3769\n",
      "3779\n",
      "3793\n",
      "3797\n",
      "3803\n",
      "3821\n",
      "3823\n",
      "3833\n",
      "3847\n",
      "3851\n",
      "3853\n",
      "3863\n",
      "3877\n",
      "3881\n",
      "3889\n",
      "3907\n",
      "3911\n",
      "3917\n",
      "3919\n",
      "3923\n",
      "3929\n",
      "3931\n",
      "3943\n",
      "3947\n",
      "3967\n",
      "3989\n",
      "4001\n",
      "4003\n",
      "4007\n",
      "4013\n",
      "4019\n",
      "4021\n",
      "4027\n",
      "4049\n",
      "4051\n",
      "4057\n",
      "4073\n",
      "4079\n",
      "4091\n",
      "4093\n",
      "4099\n",
      "4111\n",
      "4127\n",
      "4129\n",
      "4133\n",
      "4139\n",
      "4153\n",
      "4157\n",
      "4159\n",
      "4177\n",
      "4201\n",
      "4211\n",
      "4217\n",
      "4219\n",
      "4229\n",
      "4231\n",
      "4241\n",
      "4243\n",
      "4253\n",
      "4259\n",
      "4261\n",
      "4271\n",
      "4273\n",
      "4283\n",
      "4289\n",
      "4297\n",
      "4327\n",
      "4337\n",
      "4339\n",
      "4349\n",
      "4357\n",
      "4363\n",
      "4373\n",
      "4391\n",
      "4397\n",
      "4409\n",
      "4421\n",
      "4423\n",
      "4441\n",
      "4447\n",
      "4451\n",
      "4457\n",
      "4463\n",
      "4481\n",
      "4483\n",
      "4493\n",
      "4507\n",
      "4513\n",
      "4517\n",
      "4519\n",
      "4523\n",
      "4547\n",
      "4549\n",
      "4561\n",
      "4567\n",
      "4583\n",
      "4591\n",
      "4597\n",
      "4603\n",
      "4621\n",
      "4637\n",
      "4639\n",
      "4643\n",
      "4649\n",
      "4651\n",
      "4657\n",
      "4663\n",
      "4673\n",
      "4679\n",
      "4691\n",
      "4703\n",
      "4721\n",
      "4723\n",
      "4729\n",
      "4733\n",
      "4751\n",
      "4759\n",
      "4783\n",
      "4787\n",
      "4789\n",
      "4793\n",
      "4799\n",
      "4801\n",
      "4813\n",
      "4817\n",
      "4831\n",
      "4861\n",
      "4871\n",
      "4877\n",
      "4889\n",
      "4903\n",
      "4909\n",
      "4919\n",
      "4931\n",
      "4933\n",
      "4937\n",
      "4943\n",
      "4951\n",
      "4957\n",
      "4967\n",
      "4969\n",
      "4973\n",
      "4987\n",
      "4993\n",
      "4999\n",
      "5003\n",
      "5009\n",
      "5011\n",
      "5021\n",
      "5023\n",
      "5039\n",
      "5051\n",
      "5059\n",
      "5077\n",
      "5081\n",
      "5087\n",
      "5099\n",
      "5101\n",
      "5107\n",
      "5113\n",
      "5119\n",
      "5147\n",
      "5153\n",
      "5167\n",
      "5171\n",
      "5179\n",
      "5189\n",
      "5197\n",
      "5209\n",
      "5227\n",
      "5231\n",
      "5233\n",
      "5237\n",
      "5261\n",
      "5273\n",
      "5279\n",
      "5281\n",
      "5297\n",
      "5303\n",
      "5309\n",
      "5323\n",
      "5333\n",
      "5347\n",
      "5351\n",
      "5381\n",
      "5387\n",
      "5393\n",
      "5399\n",
      "5407\n",
      "5413\n",
      "5417\n",
      "5419\n",
      "5431\n",
      "5437\n",
      "5441\n",
      "5443\n",
      "5449\n",
      "5471\n",
      "5477\n",
      "5479\n",
      "5483\n",
      "5501\n",
      "5503\n",
      "5507\n",
      "5519\n",
      "5521\n",
      "5527\n",
      "5531\n",
      "5557\n",
      "5563\n",
      "5569\n",
      "5573\n",
      "5581\n",
      "5591\n",
      "5623\n",
      "5639\n",
      "5641\n",
      "5647\n",
      "5651\n",
      "5653\n",
      "5657\n",
      "5659\n",
      "5669\n",
      "5683\n",
      "5689\n",
      "5693\n",
      "5701\n",
      "5711\n",
      "5717\n",
      "5737\n",
      "5741\n",
      "5743\n",
      "5749\n",
      "5779\n",
      "5783\n",
      "5791\n",
      "5801\n",
      "5807\n",
      "5813\n",
      "5821\n",
      "5827\n",
      "5839\n",
      "5843\n",
      "5849\n",
      "5851\n",
      "5857\n",
      "5861\n",
      "5867\n",
      "5869\n",
      "5879\n",
      "5881\n",
      "5897\n",
      "5903\n",
      "5923\n",
      "5927\n",
      "5939\n",
      "5953\n",
      "5981\n",
      "5987\n",
      "6007\n",
      "6011\n",
      "6029\n",
      "6037\n",
      "6043\n",
      "6047\n",
      "6053\n",
      "6067\n",
      "6073\n",
      "6079\n",
      "6089\n",
      "6091\n",
      "6101\n",
      "6113\n",
      "6121\n",
      "6131\n",
      "6133\n",
      "6143\n",
      "6151\n",
      "6163\n",
      "6173\n",
      "6197\n",
      "6199\n",
      "6203\n",
      "6211\n",
      "6217\n",
      "6221\n",
      "6229\n",
      "6247\n",
      "6257\n",
      "6263\n",
      "6269\n",
      "6271\n",
      "6277\n",
      "6287\n",
      "6299\n",
      "6301\n",
      "6311\n",
      "6317\n",
      "6323\n",
      "6329\n",
      "6337\n",
      "6343\n",
      "6353\n",
      "6359\n",
      "6361\n",
      "6367\n",
      "6373\n",
      "6379\n",
      "6389\n",
      "6397\n",
      "6421\n",
      "6427\n",
      "6449\n",
      "6451\n",
      "6469\n",
      "6473\n",
      "6481\n",
      "6491\n",
      "6521\n",
      "6529\n",
      "6547\n",
      "6551\n",
      "6553\n",
      "6563\n",
      "6569\n",
      "6571\n",
      "6577\n",
      "6581\n",
      "6599\n",
      "6607\n",
      "6619\n",
      "6637\n",
      "6653\n",
      "6659\n",
      "6661\n",
      "6673\n",
      "6679\n",
      "6689\n",
      "6691\n",
      "6701\n",
      "6703\n",
      "6709\n",
      "6719\n",
      "6733\n",
      "6737\n",
      "6761\n",
      "6763\n",
      "6779\n",
      "6781\n",
      "6791\n",
      "6793\n",
      "6803\n",
      "6823\n",
      "6827\n",
      "6829\n",
      "6833\n",
      "6841\n",
      "6857\n",
      "6863\n",
      "6869\n",
      "6871\n",
      "6883\n",
      "6899\n",
      "6907\n",
      "6911\n",
      "6917\n",
      "6947\n",
      "6949\n",
      "6959\n",
      "6961\n",
      "6967\n",
      "6971\n",
      "6977\n",
      "6983\n",
      "6991\n",
      "6997\n",
      "7001\n",
      "7013\n",
      "7019\n",
      "7027\n",
      "7039\n",
      "7043\n",
      "7057\n",
      "7069\n",
      "7079\n",
      "7103\n",
      "7109\n",
      "7121\n",
      "7127\n",
      "7129\n",
      "7151\n",
      "7159\n",
      "7177\n",
      "7187\n",
      "7193\n",
      "7207\n",
      "7211\n",
      "7213\n",
      "7219\n",
      "7229\n",
      "7237\n",
      "7243\n",
      "7247\n",
      "7253\n",
      "7283\n",
      "7297\n",
      "7307\n",
      "7309\n",
      "7321\n",
      "7331\n",
      "7333\n",
      "7349\n",
      "7351\n",
      "7369\n",
      "7393\n",
      "7411\n",
      "7417\n",
      "7433\n",
      "7451\n",
      "7457\n",
      "7459\n",
      "7477\n",
      "7481\n",
      "7487\n",
      "7489\n",
      "7499\n",
      "7507\n",
      "7517\n",
      "7523\n",
      "7529\n",
      "7537\n",
      "7541\n",
      "7547\n",
      "7549\n",
      "7559\n",
      "7561\n",
      "7573\n",
      "7577\n",
      "7583\n",
      "7589\n",
      "7591\n",
      "7603\n",
      "7607\n",
      "7621\n",
      "7639\n",
      "7643\n",
      "7649\n",
      "7669\n",
      "7673\n",
      "7681\n",
      "7687\n",
      "7691\n",
      "7699\n",
      "7703\n",
      "7717\n",
      "7723\n",
      "7727\n",
      "7741\n",
      "7753\n",
      "7757\n",
      "7759\n",
      "7789\n",
      "7793\n",
      "7817\n",
      "7823\n",
      "7829\n",
      "7841\n",
      "7853\n",
      "7867\n",
      "7873\n",
      "7877\n",
      "7879\n",
      "7883\n",
      "7901\n",
      "7907\n",
      "7919\n",
      "7927\n",
      "7933\n",
      "7937\n",
      "7949\n",
      "7951\n",
      "7963\n",
      "7993\n",
      "8009\n",
      "8011\n",
      "8017\n",
      "8039\n",
      "8053\n",
      "8059\n",
      "8069\n",
      "8081\n",
      "8087\n",
      "8089\n",
      "8093\n",
      "8101\n",
      "8111\n",
      "8117\n",
      "8123\n",
      "8147\n",
      "8161\n",
      "8167\n",
      "8171\n",
      "8179\n",
      "8191\n",
      "8209\n",
      "8219\n",
      "8221\n",
      "8231\n",
      "8233\n",
      "8237\n",
      "8243\n",
      "8263\n",
      "8269\n",
      "8273\n",
      "8287\n",
      "8291\n",
      "8293\n",
      "8297\n",
      "8311\n",
      "8317\n",
      "8329\n",
      "8353\n",
      "8363\n",
      "8369\n",
      "8377\n",
      "8387\n",
      "8389\n",
      "8419\n",
      "8423\n",
      "8429\n",
      "8431\n",
      "8443\n",
      "8447\n",
      "8461\n",
      "8467\n",
      "8501\n",
      "8513\n",
      "8521\n",
      "8527\n",
      "8537\n",
      "8539\n",
      "8543\n",
      "8563\n",
      "8573\n",
      "8581\n",
      "8597\n",
      "8599\n",
      "8609\n",
      "8623\n",
      "8627\n",
      "8629\n",
      "8641\n",
      "8647\n",
      "8663\n",
      "8669\n",
      "8677\n",
      "8681\n",
      "8689\n",
      "8693\n",
      "8699\n",
      "8707\n",
      "8713\n",
      "8719\n",
      "8731\n",
      "8737\n",
      "8741\n",
      "8747\n",
      "8753\n",
      "8761\n",
      "8779\n",
      "8783\n",
      "8803\n",
      "8807\n",
      "8819\n",
      "8821\n",
      "8831\n",
      "8837\n",
      "8839\n",
      "8849\n",
      "8861\n",
      "8863\n",
      "8867\n",
      "8887\n",
      "8893\n",
      "8923\n",
      "8929\n",
      "8933\n",
      "8941\n",
      "8951\n",
      "8963\n",
      "8969\n",
      "8971\n",
      "8999\n",
      "9001\n",
      "9007\n",
      "9011\n",
      "9013\n",
      "9029\n",
      "9041\n",
      "9043\n",
      "9049\n",
      "9059\n",
      "9067\n",
      "9091\n",
      "9103\n",
      "9109\n",
      "9127\n",
      "9133\n",
      "9137\n",
      "9151\n",
      "9157\n",
      "9161\n",
      "9173\n",
      "9181\n",
      "9187\n",
      "9199\n",
      "9203\n",
      "9209\n",
      "9221\n",
      "9227\n",
      "9239\n",
      "9241\n",
      "9257\n",
      "9277\n",
      "9281\n",
      "9283\n",
      "9293\n",
      "9311\n",
      "9319\n",
      "9323\n",
      "9337\n",
      "9341\n",
      "9343\n",
      "9349\n",
      "9371\n",
      "9377\n",
      "9391\n",
      "9397\n",
      "9403\n",
      "9413\n",
      "9419\n",
      "9421\n",
      "9431\n",
      "9433\n",
      "9437\n",
      "9439\n",
      "9461\n",
      "9463\n",
      "9467\n",
      "9473\n",
      "9479\n",
      "9491\n",
      "9497\n",
      "9511\n",
      "9521\n",
      "9533\n",
      "9539\n",
      "9547\n",
      "9551\n",
      "9587\n",
      "9601\n",
      "9613\n",
      "9619\n",
      "9623\n",
      "9629\n",
      "9631\n",
      "9643\n",
      "9649\n",
      "9661\n",
      "9677\n",
      "9679\n",
      "9689\n",
      "9697\n",
      "9719\n",
      "9721\n",
      "9733\n",
      "9739\n",
      "9743\n",
      "9749\n",
      "9767\n",
      "9769\n",
      "9781\n",
      "9787\n",
      "9791\n",
      "9803\n",
      "9811\n",
      "9817\n",
      "9829\n",
      "9833\n",
      "9839\n",
      "9851\n",
      "9857\n",
      "9859\n",
      "9871\n",
      "9883\n",
      "9887\n",
      "9901\n",
      "9907\n",
      "9923\n",
      "9929\n",
      "9931\n",
      "9941\n",
      "9949\n",
      "9967\n",
      "9973\n",
      "执行时间：0.22279691696166992秒\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "\n",
    "def is_prime(num):\n",
    "    if num < 2:\n",
    "        return False\n",
    "    elif num == 2:\n",
    "        return True\n",
    "    else:\n",
    "        for i in range(2, num):\n",
    "            if num % i == 0:\n",
    "                return False\n",
    "        return True\n",
    "\n",
    "\n",
    "def prime_nums():\n",
    "    t1 = time.time()\n",
    "    for i in range(2, 10000):\n",
    "        if is_prime(i):\n",
    "            print(i)\n",
    "    t2 = time.time()\n",
    "    print(f\"执行时间：{t2 - t1}秒\")\n",
    "\n",
    "prime_nums()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8710b12",
   "metadata": {},
   "source": [
    "## 装饰器函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "29e7081e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "# 定义一个装饰器\n",
    "def display_time(func):\n",
    "    def wrapper(): # 定义一个内部函数，在装饰器中wrapper函数是一个常用的函数名，并非强制，约定俗成的\n",
    "        start_time = time.time()\n",
    "        func()  # 直接调用原函数（无参数），这里的func()是指装饰器需要修饰的函数，在这里是prime_nums()\n",
    "        end_time = time.time()\n",
    "        print(f\"执行时间: {end_time - start_time} 秒\")\n",
    "    return wrapper # return wrapper是返回函数对象，如果是return wrapper()则是立即执行wrapper函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6df6d416",
   "metadata": {},
   "source": [
    "装饰器的本质是一个高阶函数，它接收一个函数作为参数，并返回一个新函数来替代原函数。这个新函数需要：\n",
    "1. 保留原函数的调用方式（参数和返回值）。\n",
    "2. 在原函数执行前后添加额外逻辑（如计时、日志等）。\n",
    "\n",
    "因此，我们需要在装饰器内部定义一个新函数来实现这些功能。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "ce75a984",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "5\n",
      "7\n",
      "11\n",
      "13\n",
      "17\n",
      "19\n",
      "23\n",
      "29\n",
      "31\n",
      "37\n",
      "41\n",
      "43\n",
      "47\n",
      "53\n",
      "59\n",
      "61\n",
      "67\n",
      "71\n",
      "73\n",
      "79\n",
      "83\n",
      "89\n",
      "97\n",
      "101\n",
      "103\n",
      "107\n",
      "109\n",
      "113\n",
      "127\n",
      "131\n",
      "137\n",
      "139\n",
      "149\n",
      "151\n",
      "157\n",
      "163\n",
      "167\n",
      "173\n",
      "179\n",
      "181\n",
      "191\n",
      "193\n",
      "197\n",
      "199\n",
      "211\n",
      "223\n",
      "227\n",
      "229\n",
      "233\n",
      "239\n",
      "241\n",
      "251\n",
      "257\n",
      "263\n",
      "269\n",
      "271\n",
      "277\n",
      "281\n",
      "283\n",
      "293\n",
      "307\n",
      "311\n",
      "313\n",
      "317\n",
      "331\n",
      "337\n",
      "347\n",
      "349\n",
      "353\n",
      "359\n",
      "367\n",
      "373\n",
      "379\n",
      "383\n",
      "389\n",
      "397\n",
      "401\n",
      "409\n",
      "419\n",
      "421\n",
      "431\n",
      "433\n",
      "439\n",
      "443\n",
      "449\n",
      "457\n",
      "461\n",
      "463\n",
      "467\n",
      "479\n",
      "487\n",
      "491\n",
      "499\n",
      "503\n",
      "509\n",
      "521\n",
      "523\n",
      "541\n",
      "547\n",
      "557\n",
      "563\n",
      "569\n",
      "571\n",
      "577\n",
      "587\n",
      "593\n",
      "599\n",
      "601\n",
      "607\n",
      "613\n",
      "617\n",
      "619\n",
      "631\n",
      "641\n",
      "643\n",
      "647\n",
      "653\n",
      "659\n",
      "661\n",
      "673\n",
      "677\n",
      "683\n",
      "691\n",
      "701\n",
      "709\n",
      "719\n",
      "727\n",
      "733\n",
      "739\n",
      "743\n",
      "751\n",
      "757\n",
      "761\n",
      "769\n",
      "773\n",
      "787\n",
      "797\n",
      "809\n",
      "811\n",
      "821\n",
      "823\n",
      "827\n",
      "829\n",
      "839\n",
      "853\n",
      "857\n",
      "859\n",
      "863\n",
      "877\n",
      "881\n",
      "883\n",
      "887\n",
      "907\n",
      "911\n",
      "919\n",
      "929\n",
      "937\n",
      "941\n",
      "947\n",
      "953\n",
      "967\n",
      "971\n",
      "977\n",
      "983\n",
      "991\n",
      "997\n",
      "1009\n",
      "1013\n",
      "1019\n",
      "1021\n",
      "1031\n",
      "1033\n",
      "1039\n",
      "1049\n",
      "1051\n",
      "1061\n",
      "1063\n",
      "1069\n",
      "1087\n",
      "1091\n",
      "1093\n",
      "1097\n",
      "1103\n",
      "1109\n",
      "1117\n",
      "1123\n",
      "1129\n",
      "1151\n",
      "1153\n",
      "1163\n",
      "1171\n",
      "1181\n",
      "1187\n",
      "1193\n",
      "1201\n",
      "1213\n",
      "1217\n",
      "1223\n",
      "1229\n",
      "1231\n",
      "1237\n",
      "1249\n",
      "1259\n",
      "1277\n",
      "1279\n",
      "1283\n",
      "1289\n",
      "1291\n",
      "1297\n",
      "1301\n",
      "1303\n",
      "1307\n",
      "1319\n",
      "1321\n",
      "1327\n",
      "1361\n",
      "1367\n",
      "1373\n",
      "1381\n",
      "1399\n",
      "1409\n",
      "1423\n",
      "1427\n",
      "1429\n",
      "1433\n",
      "1439\n",
      "1447\n",
      "1451\n",
      "1453\n",
      "1459\n",
      "1471\n",
      "1481\n",
      "1483\n",
      "1487\n",
      "1489\n",
      "1493\n",
      "1499\n",
      "1511\n",
      "1523\n",
      "1531\n",
      "1543\n",
      "1549\n",
      "1553\n",
      "1559\n",
      "1567\n",
      "1571\n",
      "1579\n",
      "1583\n",
      "1597\n",
      "1601\n",
      "1607\n",
      "1609\n",
      "1613\n",
      "1619\n",
      "1621\n",
      "1627\n",
      "1637\n",
      "1657\n",
      "1663\n",
      "1667\n",
      "1669\n",
      "1693\n",
      "1697\n",
      "1699\n",
      "1709\n",
      "1721\n",
      "1723\n",
      "1733\n",
      "1741\n",
      "1747\n",
      "1753\n",
      "1759\n",
      "1777\n",
      "1783\n",
      "1787\n",
      "1789\n",
      "1801\n",
      "1811\n",
      "1823\n",
      "1831\n",
      "1847\n",
      "1861\n",
      "1867\n",
      "1871\n",
      "1873\n",
      "1877\n",
      "1879\n",
      "1889\n",
      "1901\n",
      "1907\n",
      "1913\n",
      "1931\n",
      "1933\n",
      "1949\n",
      "1951\n",
      "1973\n",
      "1979\n",
      "1987\n",
      "1993\n",
      "1997\n",
      "1999\n",
      "2003\n",
      "2011\n",
      "2017\n",
      "2027\n",
      "2029\n",
      "2039\n",
      "2053\n",
      "2063\n",
      "2069\n",
      "2081\n",
      "2083\n",
      "2087\n",
      "2089\n",
      "2099\n",
      "2111\n",
      "2113\n",
      "2129\n",
      "2131\n",
      "2137\n",
      "2141\n",
      "2143\n",
      "2153\n",
      "2161\n",
      "2179\n",
      "2203\n",
      "2207\n",
      "2213\n",
      "2221\n",
      "2237\n",
      "2239\n",
      "2243\n",
      "2251\n",
      "2267\n",
      "2269\n",
      "2273\n",
      "2281\n",
      "2287\n",
      "2293\n",
      "2297\n",
      "2309\n",
      "2311\n",
      "2333\n",
      "2339\n",
      "2341\n",
      "2347\n",
      "2351\n",
      "2357\n",
      "2371\n",
      "2377\n",
      "2381\n",
      "2383\n",
      "2389\n",
      "2393\n",
      "2399\n",
      "2411\n",
      "2417\n",
      "2423\n",
      "2437\n",
      "2441\n",
      "2447\n",
      "2459\n",
      "2467\n",
      "2473\n",
      "2477\n",
      "2503\n",
      "2521\n",
      "2531\n",
      "2539\n",
      "2543\n",
      "2549\n",
      "2551\n",
      "2557\n",
      "2579\n",
      "2591\n",
      "2593\n",
      "2609\n",
      "2617\n",
      "2621\n",
      "2633\n",
      "2647\n",
      "2657\n",
      "2659\n",
      "2663\n",
      "2671\n",
      "2677\n",
      "2683\n",
      "2687\n",
      "2689\n",
      "2693\n",
      "2699\n",
      "2707\n",
      "2711\n",
      "2713\n",
      "2719\n",
      "2729\n",
      "2731\n",
      "2741\n",
      "2749\n",
      "2753\n",
      "2767\n",
      "2777\n",
      "2789\n",
      "2791\n",
      "2797\n",
      "2801\n",
      "2803\n",
      "2819\n",
      "2833\n",
      "2837\n",
      "2843\n",
      "2851\n",
      "2857\n",
      "2861\n",
      "2879\n",
      "2887\n",
      "2897\n",
      "2903\n",
      "2909\n",
      "2917\n",
      "2927\n",
      "2939\n",
      "2953\n",
      "2957\n",
      "2963\n",
      "2969\n",
      "2971\n",
      "2999\n",
      "3001\n",
      "3011\n",
      "3019\n",
      "3023\n",
      "3037\n",
      "3041\n",
      "3049\n",
      "3061\n",
      "3067\n",
      "3079\n",
      "3083\n",
      "3089\n",
      "3109\n",
      "3119\n",
      "3121\n",
      "3137\n",
      "3163\n",
      "3167\n",
      "3169\n",
      "3181\n",
      "3187\n",
      "3191\n",
      "3203\n",
      "3209\n",
      "3217\n",
      "3221\n",
      "3229\n",
      "3251\n",
      "3253\n",
      "3257\n",
      "3259\n",
      "3271\n",
      "3299\n",
      "3301\n",
      "3307\n",
      "3313\n",
      "3319\n",
      "3323\n",
      "3329\n",
      "3331\n",
      "3343\n",
      "3347\n",
      "3359\n",
      "3361\n",
      "3371\n",
      "3373\n",
      "3389\n",
      "3391\n",
      "3407\n",
      "3413\n",
      "3433\n",
      "3449\n",
      "3457\n",
      "3461\n",
      "3463\n",
      "3467\n",
      "3469\n",
      "3491\n",
      "3499\n",
      "3511\n",
      "3517\n",
      "3527\n",
      "3529\n",
      "3533\n",
      "3539\n",
      "3541\n",
      "3547\n",
      "3557\n",
      "3559\n",
      "3571\n",
      "3581\n",
      "3583\n",
      "3593\n",
      "3607\n",
      "3613\n",
      "3617\n",
      "3623\n",
      "3631\n",
      "3637\n",
      "3643\n",
      "3659\n",
      "3671\n",
      "3673\n",
      "3677\n",
      "3691\n",
      "3697\n",
      "3701\n",
      "3709\n",
      "3719\n",
      "3727\n",
      "3733\n",
      "3739\n",
      "3761\n",
      "3767\n",
      "3769\n",
      "3779\n",
      "3793\n",
      "3797\n",
      "3803\n",
      "3821\n",
      "3823\n",
      "3833\n",
      "3847\n",
      "3851\n",
      "3853\n",
      "3863\n",
      "3877\n",
      "3881\n",
      "3889\n",
      "3907\n",
      "3911\n",
      "3917\n",
      "3919\n",
      "3923\n",
      "3929\n",
      "3931\n",
      "3943\n",
      "3947\n",
      "3967\n",
      "3989\n",
      "4001\n",
      "4003\n",
      "4007\n",
      "4013\n",
      "4019\n",
      "4021\n",
      "4027\n",
      "4049\n",
      "4051\n",
      "4057\n",
      "4073\n",
      "4079\n",
      "4091\n",
      "4093\n",
      "4099\n",
      "4111\n",
      "4127\n",
      "4129\n",
      "4133\n",
      "4139\n",
      "4153\n",
      "4157\n",
      "4159\n",
      "4177\n",
      "4201\n",
      "4211\n",
      "4217\n",
      "4219\n",
      "4229\n",
      "4231\n",
      "4241\n",
      "4243\n",
      "4253\n",
      "4259\n",
      "4261\n",
      "4271\n",
      "4273\n",
      "4283\n",
      "4289\n",
      "4297\n",
      "4327\n",
      "4337\n",
      "4339\n",
      "4349\n",
      "4357\n",
      "4363\n",
      "4373\n",
      "4391\n",
      "4397\n",
      "4409\n",
      "4421\n",
      "4423\n",
      "4441\n",
      "4447\n",
      "4451\n",
      "4457\n",
      "4463\n",
      "4481\n",
      "4483\n",
      "4493\n",
      "4507\n",
      "4513\n",
      "4517\n",
      "4519\n",
      "4523\n",
      "4547\n",
      "4549\n",
      "4561\n",
      "4567\n",
      "4583\n",
      "4591\n",
      "4597\n",
      "4603\n",
      "4621\n",
      "4637\n",
      "4639\n",
      "4643\n",
      "4649\n",
      "4651\n",
      "4657\n",
      "4663\n",
      "4673\n",
      "4679\n",
      "4691\n",
      "4703\n",
      "4721\n",
      "4723\n",
      "4729\n",
      "4733\n",
      "4751\n",
      "4759\n",
      "4783\n",
      "4787\n",
      "4789\n",
      "4793\n",
      "4799\n",
      "4801\n",
      "4813\n",
      "4817\n",
      "4831\n",
      "4861\n",
      "4871\n",
      "4877\n",
      "4889\n",
      "4903\n",
      "4909\n",
      "4919\n",
      "4931\n",
      "4933\n",
      "4937\n",
      "4943\n",
      "4951\n",
      "4957\n",
      "4967\n",
      "4969\n",
      "4973\n",
      "4987\n",
      "4993\n",
      "4999\n",
      "5003\n",
      "5009\n",
      "5011\n",
      "5021\n",
      "5023\n",
      "5039\n",
      "5051\n",
      "5059\n",
      "5077\n",
      "5081\n",
      "5087\n",
      "5099\n",
      "5101\n",
      "5107\n",
      "5113\n",
      "5119\n",
      "5147\n",
      "5153\n",
      "5167\n",
      "5171\n",
      "5179\n",
      "5189\n",
      "5197\n",
      "5209\n",
      "5227\n",
      "5231\n",
      "5233\n",
      "5237\n",
      "5261\n",
      "5273\n",
      "5279\n",
      "5281\n",
      "5297\n",
      "5303\n",
      "5309\n",
      "5323\n",
      "5333\n",
      "5347\n",
      "5351\n",
      "5381\n",
      "5387\n",
      "5393\n",
      "5399\n",
      "5407\n",
      "5413\n",
      "5417\n",
      "5419\n",
      "5431\n",
      "5437\n",
      "5441\n",
      "5443\n",
      "5449\n",
      "5471\n",
      "5477\n",
      "5479\n",
      "5483\n",
      "5501\n",
      "5503\n",
      "5507\n",
      "5519\n",
      "5521\n",
      "5527\n",
      "5531\n",
      "5557\n",
      "5563\n",
      "5569\n",
      "5573\n",
      "5581\n",
      "5591\n",
      "5623\n",
      "5639\n",
      "5641\n",
      "5647\n",
      "5651\n",
      "5653\n",
      "5657\n",
      "5659\n",
      "5669\n",
      "5683\n",
      "5689\n",
      "5693\n",
      "5701\n",
      "5711\n",
      "5717\n",
      "5737\n",
      "5741\n",
      "5743\n",
      "5749\n",
      "5779\n",
      "5783\n",
      "5791\n",
      "5801\n",
      "5807\n",
      "5813\n",
      "5821\n",
      "5827\n",
      "5839\n",
      "5843\n",
      "5849\n",
      "5851\n",
      "5857\n",
      "5861\n",
      "5867\n",
      "5869\n",
      "5879\n",
      "5881\n",
      "5897\n",
      "5903\n",
      "5923\n",
      "5927\n",
      "5939\n",
      "5953\n",
      "5981\n",
      "5987\n",
      "6007\n",
      "6011\n",
      "6029\n",
      "6037\n",
      "6043\n",
      "6047\n",
      "6053\n",
      "6067\n",
      "6073\n",
      "6079\n",
      "6089\n",
      "6091\n",
      "6101\n",
      "6113\n",
      "6121\n",
      "6131\n",
      "6133\n",
      "6143\n",
      "6151\n",
      "6163\n",
      "6173\n",
      "6197\n",
      "6199\n",
      "6203\n",
      "6211\n",
      "6217\n",
      "6221\n",
      "6229\n",
      "6247\n",
      "6257\n",
      "6263\n",
      "6269\n",
      "6271\n",
      "6277\n",
      "6287\n",
      "6299\n",
      "6301\n",
      "6311\n",
      "6317\n",
      "6323\n",
      "6329\n",
      "6337\n",
      "6343\n",
      "6353\n",
      "6359\n",
      "6361\n",
      "6367\n",
      "6373\n",
      "6379\n",
      "6389\n",
      "6397\n",
      "6421\n",
      "6427\n",
      "6449\n",
      "6451\n",
      "6469\n",
      "6473\n",
      "6481\n",
      "6491\n",
      "6521\n",
      "6529\n",
      "6547\n",
      "6551\n",
      "6553\n",
      "6563\n",
      "6569\n",
      "6571\n",
      "6577\n",
      "6581\n",
      "6599\n",
      "6607\n",
      "6619\n",
      "6637\n",
      "6653\n",
      "6659\n",
      "6661\n",
      "6673\n",
      "6679\n",
      "6689\n",
      "6691\n",
      "6701\n",
      "6703\n",
      "6709\n",
      "6719\n",
      "6733\n",
      "6737\n",
      "6761\n",
      "6763\n",
      "6779\n",
      "6781\n",
      "6791\n",
      "6793\n",
      "6803\n",
      "6823\n",
      "6827\n",
      "6829\n",
      "6833\n",
      "6841\n",
      "6857\n",
      "6863\n",
      "6869\n",
      "6871\n",
      "6883\n",
      "6899\n",
      "6907\n",
      "6911\n",
      "6917\n",
      "6947\n",
      "6949\n",
      "6959\n",
      "6961\n",
      "6967\n",
      "6971\n",
      "6977\n",
      "6983\n",
      "6991\n",
      "6997\n",
      "7001\n",
      "7013\n",
      "7019\n",
      "7027\n",
      "7039\n",
      "7043\n",
      "7057\n",
      "7069\n",
      "7079\n",
      "7103\n",
      "7109\n",
      "7121\n",
      "7127\n",
      "7129\n",
      "7151\n",
      "7159\n",
      "7177\n",
      "7187\n",
      "7193\n",
      "7207\n",
      "7211\n",
      "7213\n",
      "7219\n",
      "7229\n",
      "7237\n",
      "7243\n",
      "7247\n",
      "7253\n",
      "7283\n",
      "7297\n",
      "7307\n",
      "7309\n",
      "7321\n",
      "7331\n",
      "7333\n",
      "7349\n",
      "7351\n",
      "7369\n",
      "7393\n",
      "7411\n",
      "7417\n",
      "7433\n",
      "7451\n",
      "7457\n",
      "7459\n",
      "7477\n",
      "7481\n",
      "7487\n",
      "7489\n",
      "7499\n",
      "7507\n",
      "7517\n",
      "7523\n",
      "7529\n",
      "7537\n",
      "7541\n",
      "7547\n",
      "7549\n",
      "7559\n",
      "7561\n",
      "7573\n",
      "7577\n",
      "7583\n",
      "7589\n",
      "7591\n",
      "7603\n",
      "7607\n",
      "7621\n",
      "7639\n",
      "7643\n",
      "7649\n",
      "7669\n",
      "7673\n",
      "7681\n",
      "7687\n",
      "7691\n",
      "7699\n",
      "7703\n",
      "7717\n",
      "7723\n",
      "7727\n",
      "7741\n",
      "7753\n",
      "7757\n",
      "7759\n",
      "7789\n",
      "7793\n",
      "7817\n",
      "7823\n",
      "7829\n",
      "7841\n",
      "7853\n",
      "7867\n",
      "7873\n",
      "7877\n",
      "7879\n",
      "7883\n",
      "7901\n",
      "7907\n",
      "7919\n",
      "7927\n",
      "7933\n",
      "7937\n",
      "7949\n",
      "7951\n",
      "7963\n",
      "7993\n",
      "8009\n",
      "8011\n",
      "8017\n",
      "8039\n",
      "8053\n",
      "8059\n",
      "8069\n",
      "8081\n",
      "8087\n",
      "8089\n",
      "8093\n",
      "8101\n",
      "8111\n",
      "8117\n",
      "8123\n",
      "8147\n",
      "8161\n",
      "8167\n",
      "8171\n",
      "8179\n",
      "8191\n",
      "8209\n",
      "8219\n",
      "8221\n",
      "8231\n",
      "8233\n",
      "8237\n",
      "8243\n",
      "8263\n",
      "8269\n",
      "8273\n",
      "8287\n",
      "8291\n",
      "8293\n",
      "8297\n",
      "8311\n",
      "8317\n",
      "8329\n",
      "8353\n",
      "8363\n",
      "8369\n",
      "8377\n",
      "8387\n",
      "8389\n",
      "8419\n",
      "8423\n",
      "8429\n",
      "8431\n",
      "8443\n",
      "8447\n",
      "8461\n",
      "8467\n",
      "8501\n",
      "8513\n",
      "8521\n",
      "8527\n",
      "8537\n",
      "8539\n",
      "8543\n",
      "8563\n",
      "8573\n",
      "8581\n",
      "8597\n",
      "8599\n",
      "8609\n",
      "8623\n",
      "8627\n",
      "8629\n",
      "8641\n",
      "8647\n",
      "8663\n",
      "8669\n",
      "8677\n",
      "8681\n",
      "8689\n",
      "8693\n",
      "8699\n",
      "8707\n",
      "8713\n",
      "8719\n",
      "8731\n",
      "8737\n",
      "8741\n",
      "8747\n",
      "8753\n",
      "8761\n",
      "8779\n",
      "8783\n",
      "8803\n",
      "8807\n",
      "8819\n",
      "8821\n",
      "8831\n",
      "8837\n",
      "8839\n",
      "8849\n",
      "8861\n",
      "8863\n",
      "8867\n",
      "8887\n",
      "8893\n",
      "8923\n",
      "8929\n",
      "8933\n",
      "8941\n",
      "8951\n",
      "8963\n",
      "8969\n",
      "8971\n",
      "8999\n",
      "9001\n",
      "9007\n",
      "9011\n",
      "9013\n",
      "9029\n",
      "9041\n",
      "9043\n",
      "9049\n",
      "9059\n",
      "9067\n",
      "9091\n",
      "9103\n",
      "9109\n",
      "9127\n",
      "9133\n",
      "9137\n",
      "9151\n",
      "9157\n",
      "9161\n",
      "9173\n",
      "9181\n",
      "9187\n",
      "9199\n",
      "9203\n",
      "9209\n",
      "9221\n",
      "9227\n",
      "9239\n",
      "9241\n",
      "9257\n",
      "9277\n",
      "9281\n",
      "9283\n",
      "9293\n",
      "9311\n",
      "9319\n",
      "9323\n",
      "9337\n",
      "9341\n",
      "9343\n",
      "9349\n",
      "9371\n",
      "9377\n",
      "9391\n",
      "9397\n",
      "9403\n",
      "9413\n",
      "9419\n",
      "9421\n",
      "9431\n",
      "9433\n",
      "9437\n",
      "9439\n",
      "9461\n",
      "9463\n",
      "9467\n",
      "9473\n",
      "9479\n",
      "9491\n",
      "9497\n",
      "9511\n",
      "9521\n",
      "9533\n",
      "9539\n",
      "9547\n",
      "9551\n",
      "9587\n",
      "9601\n",
      "9613\n",
      "9619\n",
      "9623\n",
      "9629\n",
      "9631\n",
      "9643\n",
      "9649\n",
      "9661\n",
      "9677\n",
      "9679\n",
      "9689\n",
      "9697\n",
      "9719\n",
      "9721\n",
      "9733\n",
      "9739\n",
      "9743\n",
      "9749\n",
      "9767\n",
      "9769\n",
      "9781\n",
      "9787\n",
      "9791\n",
      "9803\n",
      "9811\n",
      "9817\n",
      "9829\n",
      "9833\n",
      "9839\n",
      "9851\n",
      "9857\n",
      "9859\n",
      "9871\n",
      "9883\n",
      "9887\n",
      "9901\n",
      "9907\n",
      "9923\n",
      "9929\n",
      "9931\n",
      "9941\n",
      "9949\n",
      "9967\n",
      "9973\n",
      "执行时间: 0.2175121307373047 秒\n"
     ]
    }
   ],
   "source": [
    "# 继续定义判断质数的函数\n",
    "def is_prime(num):\n",
    "    \"\"\"\n",
    "    判断一个数是否为素数\n",
    "    \"\"\"\n",
    "    if num < 2:\n",
    "        return False\n",
    "    elif num == 2:\n",
    "        return True\n",
    "    else:\n",
    "        for i in range(2, num):\n",
    "            if num % i == 0:\n",
    "                return False\n",
    "        return True\n",
    "\n",
    "# 装饰器的标准写法\n",
    "@display_time\n",
    "def prime_nums(): # 这2行是一个整体\n",
    "    \"\"\"\n",
    "    找出2到10000之间的所有素数并打印\n",
    "    \"\"\"\n",
    "    for i in range(2, 10000):\n",
    "        if is_prime(i):\n",
    "            print(i)\n",
    "\n",
    "\n",
    "prime_nums()\n",
    "# 执行时间每次都会变，但是变动不大，一般计算稳定的执行时间我们都是重复1000遍，然后取平均"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6726510f",
   "metadata": {},
   "source": [
    "复制上述完整的代码到py文件，然后在say_hello()处打上断点，进行单步调试（不用逐过程因为需要进入到函数内部）查看执行顺序"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "239924dc",
   "metadata": {},
   "source": [
    "之所以采取这种写法可以实现这个逻辑，是因为装饰器在设计的时候底层思想如下,`@display_time` 等价于：：\n",
    "```python\n",
    "def prime_nums():\n",
    "    ...  # 函数体\n",
    "\n",
    "prime_nums = display_time(prime_nums) \n",
    "```\n",
    "\n",
    "装饰器的执行流程为：\n",
    "1. **定义装饰器函数 `display_time`**：它接收一个函数 `func` 作为参数，并返回 `wrapper` 函数。\n",
    "2. **定义被装饰函数 `prime_nums`**：此时 `prime_nums` 是一个普通函数对象。\n",
    "3. **应用装饰器**：Python 自动将 `prime_nums` 作为参数传递给 `display_time`，即执行 `display_time(prime_nums)`。\n",
    "4. **替换原函数**：`display_time` 返回 `wrapper` 函数，Python 用这个新函数**覆盖**了原来的 `prime_nums`。\n",
    "\n",
    "也就是说装饰后，原函数名指向 `wrapper`，而非原始函数。\n",
    "\n",
    "\n",
    "当你调用 `prime_nums()` 时，实际上执行的是 `wrapper()`，它会：\n",
    "1. 记录开始时间\n",
    "2. 调用 `func()`（即原函数）\n",
    "3. 记录结束时间并打印耗时\n",
    "\n",
    "这种等价的设计，会让初学者搞不懂为什么突然可以采取这种优雅的写法，类似的写法还有很多，在python中叫做语法糖：通过规范的写法来让代码更加优美和简洁，比如列表推导式也是，我们在后面再提。\n",
    "\n",
    "你可以把@理解为语法糖操作，实际上并非是@装饰器，而是@装饰器+下一行的代码  二者是一个整体"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66ed296a",
   "metadata": {},
   "source": [
    "## 进一步拓展装饰器实现复用"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a5ba9fa",
   "metadata": {},
   "source": [
    "可以看到，上述这个写法的时候，prime_nums()没有传入参数，如果函数有参数，那么必须给外部函数传入参数，也就是需要给外部的装饰器函数传入参数。\n",
    "\n",
    "那么装饰器函数是需要复用的，不同的内部函数传入的参数不同，那就需要装饰器可以传入可变参数来维持这个特性。这就是说到了我们昨天的可变参数\n",
    "\n",
    "装饰器函数返回的是wrapper函数，所以，在调用装饰器函数的时候，返回的还是wrapper函数，而不是被修饰的函数。他是被修饰函数的外层函数，参数要大于等于被修饰函数的参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "61d24c16",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "函数执行时间: 0.0 秒\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import time\n",
    "\n",
    "def display_time(func):\n",
    "    \"\"\"支持任意参数的时间统计装饰器\"\"\"\n",
    "    def wrapper(*args, **kwargs):  # 接收任意数量的位置参数和关键字参数\n",
    "        t1 = time.time()\n",
    "        result = func(*args, **kwargs)  # 将参数传递给原函数，注意之前的无参数写法和现在不同\n",
    "        t2 = time.time()\n",
    "        print(f\"函数执行时间: {t2 - t1} 秒\")\n",
    "        return result  # 返回原函数的返回值\n",
    "    return wrapper\n",
    "\n",
    "@display_time\n",
    "def add(a, b):\n",
    "    return a + b\n",
    "\n",
    "add(3, 5)  # 正常接收参数并计算"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb979bc0",
   "metadata": {},
   "source": [
    "最后一个tips：注意下内部函数有无返回值？\n",
    "\n",
    "注意到之前被修饰的函数在无参数情况下，wrapper里面只有func(),现在是result = func(*args, **kwargs)以及加上了return result\n",
    "\n",
    "为什么会这样？因为被修饰的函数是return xxxx，而不是print xxx，被修饰的函数如果有返回值，装饰器函数就需要搭配返回值。\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbe0ade3",
   "metadata": {},
   "source": [
    "## 今日作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "cb76ae41",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始执行函数 multiply，参数: (2, 3), {}\n",
      "函数 multiply 执行完毕，返回值: 6\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 作业答案\n",
    "\n",
    "def logger(func):\n",
    "    def wrapper(*args, **kwargs):  # args 是元组，kwargs 是字典\n",
    "        print(f\"开始执行函数 {func.__name__}，参数: {args}, {kwargs}\")\n",
    "        result = func(*args, **kwargs)\n",
    "        print(f\"函数 {func.__name__} 执行完毕，返回值: {result}\")\n",
    "        return result\n",
    "    return wrapper\n",
    "\n",
    "@logger\n",
    "def multiply(a, b):\n",
    "    return a * b \n",
    "\n",
    "multiply(2, 3)  # 调用 multiply 函数，观察日志输出\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "c8b223bf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始执行函数 multiply，参数: (), {'a': 2, 'b': 3}\n",
      "函数 multiply 执行完毕，返回值: 6\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "multiply(a=2, b=3)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "ffad4f70",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "开始执行函数 multiply，参数: (2,), {'b': 3}\n",
      "函数 multiply 执行完毕，返回值: 6\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "multiply(2, b=3)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "db58b84a",
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "positional argument follows keyword argument (1848295646.py, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  Cell \u001b[1;32mIn[33], line 1\u001b[1;36m\u001b[0m\n\u001b[1;33m    multiply(a = 2, 3)\u001b[0m\n\u001b[1;37m                    ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n"
     ]
    }
   ],
   "source": [
    "multiply(a = 2, 3) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "266122dc",
   "metadata": {},
   "source": [
    "报错是因为关键字参数必须跟在所有位置参数之后"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "vs",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
